package tools

import (
	"log"
	"prometheus_import_consul/global"

	"github.com/hashicorp/consul/api"
)

func Add_Interface(nameInterface, urlInterface, requestMethod, contentType, requestClientId, requestToken, requestBody, responseValue, env, serviceType, businessCode string) {
	// 创建服务注册的配置
	registration := &api.AgentServiceRegistration{
		ID:   nameInterface,                                                // 接口名称作为服务ID
		Name: global.Config.Consul.ServiceName[4],                          // 服务名称
		Tags: []string{global.Config.Consul.ServiceName[4], requestMethod}, // 使用标签区分协议类型和请求方法
		Meta: map[string]string{
			"url":            urlInterface,
			"response_value": responseValue,
			"env":            env,
			"type":           serviceType,
			"business_code":  businessCode,
		},
		/*
			 	添加健康检查
				当使用Consul进行服务健康检查时，特别是通过HTTP方法（如POST）发送具有特定返回值的请求，需要注意的是Consul本身并不直接支持基于返回值内容的健康检查。
				Consul的HTTP健康检查主要依赖于HTTP响应状态码来判断服务的健康状态。
				通常情况下，如果响应的状态码是200到399之间，Consul认为服务是健康的。
				因此此处最终的健康检查由prometheus中的blackbox_exporter黑盒监控实现
		*/
		Check: &api.AgentServiceCheck{
			HTTP:     urlInterface,
			Interval: "10s", // 10秒检查一次
			Timeout:  "20s", // 超时时间为1秒
			Method:   requestMethod,
			Header: map[string][]string{
				"Content-Type": {
					contentType,
				},
				"Client-Id": {
					requestClientId,
				},
				"Token": {
					requestToken,
				},
			},
			Body:                           requestBody,
			DeregisterCriticalServiceAfter: "5m", // 如果服务1分钟内处于critical状态，则自动注销
		},
	}

	// 使用Consul客户端注册服务
	if err := global.ConsulClient.Agent().ServiceRegister(registration); err != nil {
		log.Fatalf("ServiceURL Error registering service with Consul: %v\n", err)
		return
	}

	log.Printf("ServiceURL %s registered successfully\n", nameInterface)
}
